// 导入登录、退出、获取用户资料的请求方法
import { login, logout, getInfo } from "@/api/user";
// 读取token、设置token、移除token
import { getToken, setToken, removeToken } from "@/utils/auth";
// 重置路由
import { resetRouter } from "@/router";

const getDefaultState = () => {
  return {
    token: getToken(), // token数据信息
    userInfo: {} //用户资料
  };
};
// state数据
const state = getDefaultState();
// mutations方法
const mutations = {
  // 重置state数据
  RESET_STATE: (state) => {
    Object.assign(state, getDefaultState());
  },
  // 设置token
  SET_TOKEN: (state, token) => {
    state.token = token;
  },
  // 设置用户资料
  SET_USAERINFO: (state, data) => {
    state.userInfo = data;
  },

};
// actions方法
const actions = {
  // 用户登录
  // TODO: 用户登录逻辑   发起登录请求、存储token(存state存本地)
  async login({ commit }, userInfo) {
    // 读取调用该action方法时候，传入的用户资料
    // 发起网路请求
    let res = await login(userInfo)
    // 设置token
    commit("SET_TOKEN", res.token);
    // 存储到本地
    setToken(res.token);
  },

  // 获取用户资料
  // TODO: 获取用户资料逻辑   发起请求、存储用户资料(存state)
  async getInfo({ commit, state }) {
    let res = await getInfo()
    commit('SET_USAERINFO', res.userInfo)
  },

  // 退出逻辑，发生退出请求
  // TODO: 退出逻辑 【移除本地token、重置路由、重置state数据、重置侧边栏信息】
  logout({ commit, state }) {
    // 移除token
    removeToken(); // must remove  token  first
    //重置路由
    resetRouter();
    // 重置state
    commit("RESET_STATE");
  },

  // 移除token
  resetToken({ commit }) {
    return new Promise((resolve) => {
      removeToken(); // must remove  token  first
      commit("RESET_STATE");
      resolve();
    });
  },
};
// 建立模块暴露出去
export default {
  namespaced: true,
  state,
  mutations,
  actions,
};